package com.hcss.common.redis.base;

import org.springframework.data.redis.core.ZSetOperations;

import java.util.Collection;
import java.util.Set;

/**
 * @描述: ZSet类型RedisTemplate Dao层接口
 * @作者: xuqian
 * @创建日期: 2018-08-07 11:56
 * @公司 浙江鸿程计算机系统有限公司
 */
public interface RedisZSetDao<T> extends BaseRedisDao<T> {
    /**
     * 获取当前操作SetOperations
     * @return
     */
    ZSetOperations getZSetOperations();

    /**
     * 插入数据
     * @param key key值
     * @param value 要存储的数据
     * @param score 排序值
     */
    void insert(String key, T value, double score);

    /**
     * 批量插入数据
     * @param key key值
     * @param data 数据
     * @param columnName 排序值字段名
     */
    void insert(String key, Collection<T> data, String columnName);

    /**
     * 获取全部数据集合
     * @param key key值
     * @return
     */
    Set<T> selectAll(String key);

    /**
     * 获取全部倒序数据集合
     * @param key key值
     * @return
     */
    Set<T> selectAllReverse(String key);

    /**
     * 从key对应的ZSet集合获取从start下标开始到end下标的数据集合
     * 0表示list的开头第一，-1表示list的倒数第一个，即最后一个。
     * -2则便是list的倒数第二个，以此类推。
     * @param key key值
     * @param start 开始下标
     * @param end 结束下标
     * @return
     */
    Set<T> selectSet(String key, long start, long end);

    /**
     * 从key对应的ZSet集合获取从start下标开始到end下标的数据集合，倒序返回
     * @param key key值
     * @param start 开始下标
     * @param end 结束下标
     * @return
     */
    Set<T> selectSetReverse(String key, long start, long end);

    /**
     * 获取指定分数范围内的数据
     * @param key key值
     * @param min 开始值
     * @param max 结束值
     * @return
     */
    Set<T> selectByScore(String key, double min, double max);

    /**
     * 获取指定分数范围内的数据 倒序返回
     * @param key key值
     * @param min 开始值
     * @param max 结束值
     * @return
     */
    Set<T> selectReverseByScore(String key, double min, double max);

    /**
     * 删除指定元素
     * @param key key值
     * @param values 不定长 要删除的数据
     */
    void delete(String key, T... values);

    /**
     * 删除全部
     * @param key key值
     */
    void deleteAll(String key);

    /**
     * 获取交集，保存到key3 并返回
     * @param key1 key1
     * @param key2 key2
     * @param key3 交集要保存的key
     * @return
     */
    Set<T> getInterAndStore(String key1, String key2, String key3);

    /**
     * 获取并集，保存到key3 并返回
     * @param key1 key1
     * @param key2 key2
     * @param key3 并集要保存的key
     * @return
     */
    Set<T> getUnionAndStore(String key1, String key2, String key3);

    /**
     * 获取{min, max}范围内数据个数
     * @param key
     * @param min
     * @param max
     * @return
     */
    Long count(String key, double min, double max);

    /**
     * 获取集合内数据个数
     * @param key
     * @return
     */
    Long size(String key);

    /**
     * 获取value值在key对应集合中索引位置
     * @param key
     * @param value
     * @return
     */
    Long selectValueIndex(String key, T value);

    /**
     * 获取value值在集合中的排序值
     * @param key
     * @param value
     * @return
     */
    Double selectValueScore(String key, T value);
}
